ファイル
■ WAVE ファイル
■ 全般
・WAVE ファイルは音楽・音声データを対象とした、マイクロソフトがつくったRIFF(リフとよむ: Resource InterChange File Format)というフォー
マット形式のファイルです。 WAVE (ウェーブとよむ)ファイルは、windowsの拡張子がwavであることからWAV(ダブリュー・エー・ブイ)ファイル
と呼ぶひとも多いようです。RIFF形式ファイルとしては、他にAVI、PNGなどがあります。
・マイクロソフトはデータのまとまりをチャンク(Chunk: 塊)と呼んでいます。RIFF形式のファイル(チャンク)のChunk IDは文字列”RIFF”です。WAVE
ファイルはRIFF形式であるので 文字列”WAVE”というRIFF type ID が与えられています。WAVEファイルの中では、さらにフォーマット関係の
チャンクにはChank ID として文字列”fmt ” 及びデータ関係のチャンクにはChank IDとして”data”があたえられています。
・WAVEファイルデータのなかで、実際の音楽データの部分をチャンクとよびます。 すなわち オフセット0x2C以降の部分をチャンクと呼びます。
したがって、WAVファイルのサイズには以下の関係があります。
WAVファイルのサイズ[バイト] = 44[バイト] (= 0x2c = 16x2 + 12) + チャンクのサイズ[バイト]
★実際にあるWAVファイルの ファイルサイズとチャンクサイズをバイナリエディタで調べてみると以下の結果でした。
WAVファイルサイズ …… 0x0174477c = 24397692[バイト]
チャンクサイズ …… 0x01744750 = 24397648[バイト]
WAVファイルサイズ - チャンクサイズ = 24397692[バイト] - 24397648[バイト] = 44[バイト]
★ WAVEファイル技術情報URL
■ ファイルヘッダー情報( →書込みプログラム例)
No | オフ セット offset |
サイズ [byte] |
分類 (通称) |
内容 | 記事 | |
16進表示例(注1) (先頭アドレス〜 ) |
備考 | |||||
1 | 0x00 | 4 | Chunk ID (RIFFヘッダ) |
address:00 01 02 03 16進数 52 49 46 46 |
address:00 01 02 03 16進数 52 49 46 46 ASCII R I F F |
・WindowsのRIFFファイル形式のファイルであることを表す文字列 ・固定文字列 |
2 | 0x04 | 4 | Chunk Data Size (ファイル サイズ) |
address:04 05 06 07 16進数 BA D2 06 00 |
ファイルサイズ(16進数)= 0x0006D2BA → ファイルサイズ(10進数)= 6*16**4 +13*16**3 +2*16**2 +11*16 +10 = 447,152[byte] |
・オフセットが0x08以降のファイルサイズ(バイト) ・ファイルサイズ算出に於いて、Windowsの場合リトルエンディアンであることに注意のこと |
3 | 0x08 | 4 | RIFF Type (WAVEヘッダ) |
address:08 09 0A 0B 16進数 57 41 56 45 |
address:08 09 0A 0B 16進数 57 41 56 45 ASCII W A V E |
RIFF形式のWAVEファイルであることを表す文字列 |
4 | 0x0C | 4 | Chunk ID (ファーマット チャンク ヘッダ) |
address:0C 0D 0E 0F 16進数 66 6D 74 20 ASCII f m t |
address:0C 0D 0E 0F 16進数 66 6D 74 20 ASCII f m t |
以下が ”fmt ”(フォーマット)チャンクの定義であることを表す |
5 | 0x10 | 4 | Chunk Data Size (フォーマット定義 サイズ) |
address:10 11 12 13 16進数 10 00 00 00 |
16バイト | フォーマットの定義関連のデータサイズ リニアPCM ならば 16(10 00 00 00) |
6 | 0x14 | 2 | Compression Code (フォーマットID) |
address:14 15 16進数 01 00 |
リニアPCMの場合 (圧縮なし) |
圧縮のフォーマットID 0x0001 リニアPCM 0x0002 MS ADPCM 0x0005 IBM CSVD 0x0006 A-Law 0x0007 μ-Law 0x0010 OKI ADPCM 0x0011 ADPCM(IMA/DVI) 0x0012 MediaSpace ADPCM 0x0013 Sierra ADPCM 0x0014 ADPCM(G.723) 0x0020 YAMAHA ADPCM 0x001E MPEG1 Layer-3 他 |
7 | 0x16 | 2 | Number of channels (チャンネル数) |
address:16 17 16進数 01 00 |
モノラルの場合 | モノラル の場合 0x0001 ステレオの場合 0x0002 |
8 | 0x18 | 4 | Sample rate (サンプリングレート) |
address:18 19 1A 1B 16進数 44 AC 00 00 |
サンプリングレート= 10*16**3 +12*16**2 +4*16 +4 =44100[Hz] |
44.1kHz → 44 AC 00 00 20.05KHz → 22 56 00 00 |
9 | 0x1C | 4 | Average bytes per second (データ転送速度 [byte/sec]) |
address:1C 1D 1E 1F 16進数 88 58 01 00 |
44.1kHz 16bit モノラルの場合 データ転送速度= 1*16**4 +5*16**3 +8*16**2 +8*16 +8 =88200[byte/sec] |
44.1kHz 16bit ステレオの場合 →10 B1 02 00、 44100×2×2 =176,400[byte/sec] 44.1KHz 16bit モノラルの場合 →88 58 01 00、 44100×2×1=88,200[byte/sec] 22.05KHz 16bit モノラルの場合 →44 AC 00 00、 22050×2×1=44,100[byte/sec] 22.05KHz 8bit モノラルの場合 →22 56 00 00、 20050×1×1=22050[byte/sec] |
10 | 0x20 | 2 | Block align (バイト/サンプル) |
address:20 21 16進数 01 00 |
8bit モノラル | サンプルあたりのバイト数 16bit ステレオ →04 00、 2×2=4[byte/samle] 16bit モノラル →02 00、 2×1=2[byte/sample] 8bit モノラル →01 00、 1×1=1[byte/sample] |
11 | 0x22 | 2 | Significant bits per sample (量子化ビット数) |
address:22 23 16進数 08 00 |
8ビット |
16bit の場合→10 00、 16[bit] 8bit の場合→08 00、 8[bit] |
- | - | 2 | Extra format bytes (拡張部分のサイズ) |
- | - | リニアPCMならば存在しない |
- | - | n | Extra format bytes (拡張部分) |
- | - | リニアPCMならば存在しない |
12 | 0x24 | 4 | Chunk ID (data ヘッダ) |
address:24 25 26 27 16進数 64 61 74 61 |
address:00 01 02 03 16進数 64 61 74 61 ASCII d a t a |
RIFF形式WAVEファイルのdataであることを表す文字列 |
13 |
0x28 | 4 | chunk size (データチャンクの サイズ[byte]) |
address:28 29 2A 2B 16進数 1F 9E 02 00 |
データチャンクのサイズ= 2*16**4 +9*16**3 +14*16**2 +1*16 +15 =171,551[byte] |
0x2C以降のサンプル音楽データのサイズ(バイト) |
14 | 0x2C | n |
(サンプリング データサイズ) |
address:2C 2D 2E 2F 16進数 7F 7F 7E 7D address:30 31 32 33 16進数 80 83 86 85 address:34 35 36 37 16進数 81 83 87 82 …… …… …… |
データのバイト列 |
・ 音楽サンプルデータ ・データサイズ算出に於いて、Windowsの場合リトルエンディアンであることに注意のこと |
(注1) : メモリへの配置はwindowsの場合リトルエンディアンで記載されています。
(注2): **はべき乗演算をあらわす
★ 実際のWAVEファイル
実際のWAVEファイルのヘッダ情報をバイナリエディタで表示した例を下記に示します。
<下記WAVEファイルの諸元>
・総ファイルサイズ…… 443020バイト (= 0x0006C28C)
・ファーマットID …… リニアPCM
・チャンネル数 …… モノラル
・サンプリングレート……22050 Hz
・データ転送速度 ……22050 バイト/sec
・Block align …… 1 バイト/サンプル
・量子化ビット数……8ビット
・サンプリングデータサイズ……442983バイト ( = 0x0006C267)
<実際のWAVEファイル>
■ サンプリングデータがファイル転送される順番 及び演奏される順番
サンプリングデータがファイル転送される順番(注) 及び演奏されるデータの順番はwindowsのリトルエンディアンの場合下記のようになります。
尚、 byte(0xXX)はアドレス0xXXの1バイトデータを表します。
(注)ファイル転送される順番とメモリに配置されているアドレス順(降順)は同じです。
<ファイル転送される順番>
時間 →
byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
(8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit)
<演奏される順番>
(1). 8ビットモノラルの場合 時間 →
byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
(8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit) (8bit)
(2) 8ビットステレオの
byte(0x2C)→ byte(0x2D)→byte(0x2E)→byte(0x2F)→byte(0x30)→byte(0x31)→byte(0x32)→byte(0x33)→byte(0x34)→ ……
L (8bit) R (8bit) L (8bit) R (8bit) L (8bit) R (8bit) L
(8bit) R (8bit) L (8bit)
(3). 16ビットモノラルの場合
(上位:byte(0x2D)+下位: byte(0x2C)) → (上位:byte(0x2F)+下位:byte(0x2E))→(上位:byte(0x31)+下位:byte(0x30))→(上位:byte(0x33)+byte(0x32))→ ……
(16bit) (16bit) (16bit) (16bit)
(4). 16ビットステレオの場合
(上位:byte(0x2D)+下位: byte(0x2C)) → (上位:byte(0x2F)+下位:byte(0x2E))→(上位:byte(0x31)+下位:byte(0x30))→(上位:byte(0x33)+byte(0x32))→ ……
L (16bit) R (16bit) L (16bit) R (16bit)
■ WAVEファイル構造体( →使用プログラム例)
拡張部分がない標準的なWAVEファイルを構造体で定義すると以下のようになります。
Windowsのような32ビットOSの場合と PIC24のような16ビットの場合では int等のサイズがことなるので一部定義がことなります。
(1) PCの場合
(char: 8ビットt 、short int:16ビットt 、int: 32ビット)
struct myWaveHeader //全ヘッダサイズ: 44バイト { char id_RIFF[4]; //Chunk ID RIFFヘッダ // 4バイト unsigned int size_File; //ファイルサイズ(総ファイルサイズ - 8)バイト //4バイト char id_WAVE[4]; //Chunk ID WAVE //4バイト char id_fmt[4]; //Chunk ID fmt //4バイト unsigned int size_fmt; //フォーマット関連定義データのサイズ //4バイト unsigned short int code_wavefmt; //WAVEファイルの圧縮フォーマットコード 但し、リニアPCMは圧縮なし//2バイト unsigned short int channel; //チャンネル数 //2バイト unsigned int rate_sample; //サンプリングレート //4バイト unsigned int rate_tranfer; //転送速度[byte/sec] //4バイト unsigned short int align_block; //サンプルあたりのバイト数[byte/サンプル] //2バイト unsigned short int bit_sample; //量子化ビット数[bit] //2バイト char id_data[4]; //Chunk ID data //4バイト unsigned int size_data; //サンプリングデータのサイズ[byte] //4バイト } ;
(2) PIC24、dsPIC等16bitマイコンの場合
(char: 8ビット、 int: 16ビット、 long int: 32ビット)
struct myWaveHeader //全ヘッダサイズ: 44バイト { char id_RIFF[4]; //Chunk ID RIFFヘッダ // 4バイト unsigned long int size_File; //ファイルサイズ(総ファイルサイズ - 8)バイト //4バイト char id_WAVE[4]; //Chunk ID WAVE //4バイト char id_fmt[4]; //Chunk ID fmt //4バイト unsigned long int size_fmt; //フォーマット関連定義データのサイズ //4バイト unsigned int code_wavefmt; //WAVEファイルの圧縮フォーマットコード 但し、リニアPCMは圧縮なし//2バイト unsigned int channel; //チャンネル数 //2バイト unsigned long int rate_sample; //サンプリングレート //4バイト unsigned long int rate_tranfer; //転送速度[byte/sec] //4バイト unsigned int align_block; //サンプルあたりのバイト数[byte/サンプル] //2バイト unsigned int bit_sample; //量子化ビット数[bit] //2バイト char id_data[4]; //Chunk ID data //4バイト unsigned long int size_data; //サンプリングデータのサイズ[byte] //4バイト } ;
■ 信号レベル
・ 信号レベルに関する要領は以下です。
@ 無信号レベル
WAVファイルの音声データの無信号レベルは、符号付き8ビット または16ビット整数の中央値0です。 したがってハードウェアとしては、
無信号時の ADコンバータ入力電圧をADコンバータ入力範囲の中央にセットすると最大のダイナミックレンジをとることができます。
A 最大値、最小値
最大値、最小値は 量子化ビット数が8ビット、16ビットの場合以下のようになります。
16ビット …… 最大値: 32767、最小値: -32768
8ビット …… 最大値: 127、 最小値: -128
B 振幅クリップ
Aの最小値〜最大値の範囲をはずれる値が入力された場合のクリップがないと過大入力時にノイズになるのでソフトで対応しておく
必要があります。
C ADコンバータが16ビットでない場合は値を16ビットに換算する必要があります。12ビットのADコンバータ出力であれば ADコンバータ
変換値を 基準0にレベルシフトした後に 16倍(= 2×2×2×2 : 4ビット = 16ビット − 12ビット)してWAVファイルのデータとする
必要があります。 これをしないと小さな音になってしまいます。
■ WAVEファイルの分類
名称 | 圧縮 | AD変換量子化 (音量に対する量子化)(注1) |
制定団体 | 備考 |
PCM | なし | リニア | - | VLSI社の VS1053、VS1063で エンコード/デコードができます。 |
G.711 μ-law | ・ 非線形(14ビット符号付き線形PCMの1標本を対数的に8ビットに符号化する) ・北米、日本で使用されている。 |
- | ||
G.711 A-law | ・ 非線形(13ビット符号付き線形PCMの1標本を対数的に8ビットに符号化する) ・ 欧州で使用されている。 |
- | ||
IMA ADPCM | あり | - | IMA(Interactive Multimedia Association)グループが制定 | |
G.722 ADPCM | - | 国際機関 ITU-Tが制定 |
注1. 信号レベルが小さいときに量子化雑音を低減するため(i.e. 音量が小さいときのノイズを少なくするため)、非直線量子化が行われる
・ 圧縮されたWAVEということで、WAVEファイルに分類される。 ファイル構成は、RIFFタイプのオーディオファイルです。 ・ IMA ADPCM (Interactive Multimedia Association Adaptive Differential Pulse Code Modulation) ……IMA(Interactive Multimedia Association )グループによって制定された適応的差分パルス符号変調方式 ・ IMA ADPCM録音はリニアな16ビット・オーディオと比べて概ね4:1に圧縮します. ・ VLSI社の VS1053、VS1063で エンコード/デコードができます。 ・ 拡張子は wav です。 ・ 他のADPCMとしては、 G.722 ADPCM がある。 |
■ テキストファイル
■ Windows 狭義(MS-DOS)テキストファイルの定義
・テキスト ファイルとは、キャラクタ (文字) と下記の制御コードで構成されたMS-DOSの type コマンドによって表示可能なファイルである。
・拡張子は.txt である。
ASCIIコード (16進数表示) |
エスケープ文字 (ESC文字) |
制御 | 備考 | |
@ | 0x0a | \n | LF (Line Feed) 改行 | |
A | 0x0d | \r | CR (Carriage Return) 復帰 | |
B | 0x0c | \f | FF(Form Feed) 改頁 | |
C | 0x09 | \t | HT (Horizontal Tabulation )水平タブ | |
D | 0x0b | \v | VT (Vertical Tabulation) 垂直タブ | |
E | 0x1a | - | EOF(End of File) MS-DOSにおけるテキストファイルの終端文字 |
(注) |
(注)
★ 終端制御文字 0x1a
・ 0x1aは、MS-DOSのテキストファイルの終端に添付されていたが、Winodowsのテキストファイルには添付されていない。
・ MS-DOSは、CP/M(8ビットマイコン8080のOS用としてデジタルリサーチ社のキルドールが開発したOS)との互換性を維持するために
0x1aを末尾に添付していたが、OS(MS-DOS)がファイルの終端検出に使用していたわけではない。
・ クラスタチェインにより連結されているFATでは、ファイルの終端クラスタの先頭にあるFATエントリの最終クラスタを意味する数値
(FAT32に場合は、0x0FFFFFFF)をOSが読み取ることで ファイルの終端が分かる。0x1aは、MS-DOSに於いてもファイルの終端を知る
ために必要なものではなかった。
・ いまだ一部で、(Windowsも含めて)OSがテキストファイルの終端検出として、0x1aを使用していると誤解さている。
・ MS-DOSにおいては、0x1aを アプリケーションによってはファイルの終端検出として使用していた。
★ Macintosh、UNIX
・ MS−DOSの改行+復帰(CR/LF) は Macintosh、UNIXではCR(0x0d)のみである。これらOSとのファイルコンバートに際しては
注意する必要がある。
■ テキストファイルの定義(広義)
・文字など文字コードによって表されるデータだけが含まれるファイルのことであるが、タグ(< >)を利用したHTMLファイルやXML
ファイルも可視性がよいことからテキストファイルに含められていることがある。拡張子は、html、xml等があり、 txtとは限らない。
(注)
★タグを利用して、文字の大きさや色、フォントの種類を変えたり、メッセージに背景や BGM (音) をつけることができる。(リッチテキスト
ファイル)
★メインフレーム/汎用機はほとんど、固定長レコードファイルである。したがってテキストファイルはすべての行(レコード)を同じ長さに
するよう、長さが足りない場合には空白文字などが挿入される。
★・Macintoshには、テキストファイルvsバイナリーファイルと云う概念はあるが、UNIXにはテキストファイルと云う概念はない。
■ ファイル名
WindowsのファイルシステムFATには2つの形式がある。 @ 標準形式:8.3 A ロングネーム形式:255 ・ ファイル名で使用する文字
・ FATでは、標準形式:8.3でもまたロングネーム形式:255でもファイル名のアルファベット文字はすべて大文字で管理されている。 したがって 1. abcdefgh.txt と ABCDEFGH.txt は同一とみなされ、同一フォルダ内に共存できない。 2. abcdefghijklmnopqrstuvwxyz.txt とABCDEFGHIJKLMNOPQRSTUVWXYZ.txt は同一とみなされ同一フォルダ内に共存できない。 同様に、フォルダ名もアルファベット文字はすべて大文字で管理されている。 したがって 1. abcdefgh と ABCDEFGH は同一フォルダとみなされる。 2. abcdefghijklmnopqrstuvwxyz とABCDEFGHIJKLMNOPQRSTUVWXYZ.txt は同一フォルダとみなされる。 ・ 一方 UNIX では、ファイル名、フォルダ名のアルファベット文字大文字と小文字が区別される。 Window PC内では同一とみなされていたファイルがUNIXのサーバーでは別ファイルとみなされてしまうので注意する必要がある。 |
||||||||||||||||||||||||||